//如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 
//
// 字母和数字都属于字母数字字符。 
//
// 给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。 
//
// 
//
// 示例 1： 
//
// 
//输入: s = "A man, a plan, a canal: Panama"
//输出：true
//解释："amanaplanacanalpanama" 是回文串。
// 
//
// 示例 2： 
//
// 
//输入：s = "race a car"
//输出：false
//解释："raceacar" 不是回文串。
// 
//
// 示例 3： 
//
// 
//输入：s = " "
//输出：true
//解释：在移除非字母数字字符之后，s 是一个空字符串 "" 。
//由于空字符串正着反着读都一样，所以是回文串。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 2 * 10⁵ 
// s 仅由可打印的 ASCII 字符组成 
// 
//
// Related Topics 双指针 字符串 👍 835 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean isPalindrome(String s) {
//        //1.去符号
//        StringBuffer sbStr = new StringBuffer();
//        for(int i = 0; i<s.length(); i++){
//            char c = s.charAt(i);
//            int cAscii = (int) c;
//            //48-57,数字 | 65-90大写字母|97-122小写字母
//            if( (cAscii>=48)&&cAscii<=57
//                    || (cAscii>=65&&cAscii<=90)
//                    || (cAscii>=97&&cAscii<=122)
//            ){
//                sbStr.append(c);
//            }
//        }
//        //2.转小写
//        String s1 = sbStr.toString().toLowerCase();
//        //3.比较
//        for(int i=0;i<s1.length()/2; i++){
//            if(s1.charAt(i) != s1.charAt(s1.length()-1-i))
//                return false;
//        }
//        return true;

        if(s == null || s.length() == 0)
            return true;
        int left = 0;
        int right = s.length() -1;
        while(left < right){
            while(left<right && !Character.isLetterOrDigit(s.charAt(left))){
                left ++;
            }
            while(left<right && !Character.isLetterOrDigit(s.charAt(right))){
                right--;
            }
            if(Character.toLowerCase(s.charAt(left))!=
                Character.toLowerCase(s.charAt(right))
            ){
                return false;
            }
            left++;
            right--;
        }
        return true;

    }
}
//leetcode submit region end(Prohibit modification and deletion)
